#!/bin/zsh

# 显示帮助信息
show_help() {
  echo "使用方法: $0 [选项] 压缩包文件名"
  echo "选项:"
  echo "  -d <目录>        指定解压路径"
  echo "  -r               递归解压目录中的压缩包或解压包中的压缩包"
  echo "  --dependencies   安装解压软件的依赖"
  echo "  --help           显示帮助信息"
}

# 检查参数是否为空
check_empty_parameter() {
  if [ -z "$1" ]; then
    show_help
    exit 1
  fi
}

# 检查文件是否存在
check_file_existence() {
  if [ ! -f "$1" ] && [ ! -d "$1" ]; then
    echo "文件或目录 '$1' 不存在"
    exit 1
  fi
}

# 检查输出路径
check_output_directory() {
  if [ -z "$output_dir" ]; then
    output_dir=$(dirname "$1")/$(basename "$1" ".$extension")
  fi
}

# 创建输出路径
create_output_directory() {
  mkdir -p "$1"
}

# 获取新路径
get_new_path() {
  local path="$1"
  local base="${path%.*}"
  local num=1
  local new_path="$path"

  while [ -e "$new_path" ]; do
    new_path="${base}_$num.${path##*.}"
    num=$((num + 1))
  done

  echo "$new_path"
}

# 安装解压软件依赖
install_dependencies() {
  local dependencies=("unzip" "rar" "p7zip" "tar")

  for package in "${dependencies[@]}"; do
    if ! command -v "$package" >/dev/null; then
      echo "正在安装 $package ..."
      sudo pacman -S --noconfirm "$package"
    fi
  done
}

# 递归解压函数
recursive_extract() {
  local file="$1"
  local dir="$2"

  local file_extension="${file##*.}"

  case $file_extension in
    tar.bz2|tbz2)
      tar xjf "$file" -C "$dir"
      ;;
    tar.gz|tgz)
      tar xzf "$file" -C "$dir"
      ;;
    tar.xz)
      tar xJf "$file" -C "$dir"
      ;;
    tar)
      tar xf "$file" -C "$dir"
      ;;
    bz2)
      bunzip2 "$file" -d "$dir"
      ;;
    rar)
      unrar x "$file" "$dir"
      ;;
    gz)
      gunzip "$file" -d "$dir"
      ;;
    zip)
      unzip "$file" -d "$dir"
      ;;
    Z)
      uncompress "$file" -d "$dir"
      ;;
    7z)
      7z x "$file" -o"$dir"
      ;;
    *)
      echo "不支持的压缩包格式"
      exit 1
      ;;
  esac
}

# 判断文件扩展名是否为压缩包格式
is_compressed_file() {
  local file_extension="$1"
  local compressed_extensions=("zip" "rar" "7z" "tar" "tar.gz" "tar.bz2" "tar.xz")

  for ext in "${compressed_extensions[@]}"; do
    if [ "$ext" = "$file_extension" ]; then
      return 0
    fi
  done

  return 1
}

# 递归解压目录中的压缩包
recursive_extract_directory() {
  local directory="$1"

  for file in "$directory"/*; do
    if [ -f "$file" ]; then
      local file_extension="${file##*.}"
      if is_compressed_file "$file_extension"; then
        echo "正在解压文件 '$file' ..."
        recursive_extract "$file" "$output_dir"
      fi
    elif [ -d "$file" ] && [ "$recursive" = true ]; then
      recursive_extract_directory "$file"
    fi
  done
}

# 解析参数
parse_arguments() {
  while [[ $# -gt 0 ]]; do
    case $1 in
      -d)
        output_dir="$2"
        shift
        shift
        ;;
      -r)
        recursive=true
        shift
        ;;
      --dependencies)
        install_dependencies=true
        shift
        ;;
      *)
        break
        ;;
    esac
  done
}

# 主函数
main() {
  check_empty_parameter "$1"
  check_file_existence "$1"

  filename=$(basename "$1")
  extension="${filename##*.}"
  output_dir=""
  recursive=false
  install_dependencies=false

  parse_arguments "$@"

  check_output_directory

  create_output_directory "$output_dir"

  # 安装解压软件依赖
  if [ "$install_dependencies" = true ]; then
    echo "正在安装解压软件的依赖 ..."
    install_dependencies
  fi

  # 解压文件或递归解压目录中的压缩包
  if [ -d "$1" ]; then
    if [ "$recursive" = true ]; then
      echo "正在递归解压目录 '$filename' 中的压缩包 ..."
      recursive_extract_directory "$1"
    else
      echo "无法递归解压目录 '$filename' 中的压缩包，请使用 '-r' 参数"
      exit 1
    fi
  else
    echo "正在解压文件 '$filename' ..."
    output_path="$(get_new_path "${output_dir}/${filename}")"
    recursive_extract "$1" "$output_path"
  fi

  echo "解压完成"
}

# 执行主函数
main "$@"
